/*************************************************************************
    > File Name: slave2.c
    > Author: wusihai
    > Mail: wusihai18@gmail.com 
    > Created Time: Tue 18 Feb 2020 03:15:13 PM CST
 ************************************************************************/

#include <stdio.h>
#include "slavertm.h"

#include <slave.h>
#include <math.h>
#include "register.h"
#include <simd.h>

//索引宏
#define n3d_ext(ix,iy,iz)   ix*SubNy*SubNz+iy*SubNz+iz
#define n3d(ix,iy,iz)       ix*DivNy*DivNz+iy*DivNz+iz
#define n3dY(ix,iy,iz)       ix*5*DivNz+iy*DivNz+iz
#define n3dZ(ix,iy,iz)       ix*DivNy*5+iy*5+iz

#define L1  1
#define L2  8
#define L3  48

void SmpipackX(rtm_slave_mpipack* p){
  int xx= L1;
  int yy= L2;
  int zz= L3;
  //答应字
  volatile unsigned int get_reply,put_reply;
  //本地
  rtm_slave_mpipack par;
  get_reply=0;
  athread_get(PE_MODE,p,&par,sizeof(rtm_slave_mpipack),&get_reply,0,0,0);
  while(get_reply!=1);

  //获取当前从核号，行号，列号
  volatile unsigned int myid=athread_get_id(-1);
  volatile unsigned int rowid,colid;
  GET_ROW(rowid);
  GET_COL(colid);

  int SubNx=par.SubNx;
  int SubNy=par.SubNy;
  int SubNz=par.SubNz;
  int DivNx=par.DivNx;
  int DivNy=par.DivNy;
  int DivNz=par.DivNz;

  //LDM数据存储
  float data[xx][yy][zz];

  //CG x-y loop
  int GridLoopX=(par.endX-par.stX+xx*8-1)/(8*xx);
  int GridLoopY=(par.endY-par.stY+yy*8-1)/(8*yy);
  //depth z loop
  int LoopZ=(par.endZ-par.stZ+zz-1)/(zz);

  int ix,iy,iz;
  int tx,ty,tz;
  int XX,YY,ZZ,l;
  int gx,gy,gz;
  int x,y,z;
  
  //从核- X-Y方向 循环反转
  int LX,LY,LZ=0;
  for(ix=0;ix<GridLoopX;ix++){
	gx=ix*8*xx+colid*xx;
	for(iy=0;iy<GridLoopY;iy++){
	  gy=iy*8*yy+rowid*yy;
	  if(gx<(par.endX-par.stX)&&gy<(par.endY-par.stY)){
		//重新确定X-Y计算范围-针对最边缘的CPE.
		((par.endX-par.stX)-gx)>xx?(XX=xx):(XX=((par.endX-par.stX)-gx));
		((par.endY-par.stY)-gy)>yy?(YY=yy):(YY=((par.endY-par.stY)-gy));

		//CPE block循环
		for(iz=0;iz<LoopZ;iz++){
		  //重新确定Z的计算范围
		  (par.endZ-par.stZ)-(iz*zz)>zz?(ZZ=zz):(ZZ=(par.endZ-par.stZ)-(iz*zz));
		  gz=iz*zz;

		  /**1**/
		  for(l=0;l<3;l++){
			/* 1. Load  In data */
			get_reply=0;
			for(tx=0;tx<XX;tx++){
			  for(ty=0;ty<YY;ty++){
				x=par.stX+gx+tx;
				y=par.stY+gy+ty;
				z=par.stZ+gz;
				athread_get(PE_MODE,par.Pin[l]+n3d_ext((x+5),(y+5),(z+5)),&data[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
			  }
			}
			while(get_reply!=(XX*YY));

			/* 2. write  Out data */
			put_reply=0;
			for(tx=0;tx<XX;tx++){
			  for(ty=0;ty<YY;ty++){
				x=par.stX+gx+tx;
				y=par.stY+gy+ty;
				z=par.stZ+gz;
				athread_put(PE_MODE,&data[tx][ty][0],par.Pout[l]+n3d((x),(y),(z)),sizeof(float)*(ZZ),&put_reply,0,0);
			  }
			}
			while(put_reply!=(XX*YY));
		  }
		  /**2**/
		  for(l=3;l<6;l++){
			/* 1. Load  In data */
			get_reply=0;
			for(tx=0;tx<XX;tx++){
			  for(ty=0;ty<YY;ty++){
				x=par.stX+gx+tx;
				y=par.stY+gy+ty;
				z=par.stZ+gz;
				athread_get(PE_MODE,par.Pin[l]+n3d_ext((SubNx-10+x),(y+5),(z+5)),&data[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
			  }
			}
			while(get_reply!=(XX*YY));

			/* 2. write  Out data */
			put_reply=0;
			for(tx=0;tx<XX;tx++){
			  for(ty=0;ty<YY;ty++){
				x=par.stX+gx+tx;
				y=par.stY+gy+ty;
				z=par.stZ+gz;
				athread_put(PE_MODE,&data[tx][ty][0],par.Pout[l]+n3d((x),(y),(z)),sizeof(float)*(ZZ),&put_reply,0,0);
			  }
			}
			while(put_reply!=(XX*YY));
		  }

		}
	  }
	}
  }
}
void SmpipackY(rtm_slave_mpipack* p){
  int xx= L2;
  int yy= L1;
  int zz= L3;
  //答应字
  volatile unsigned int get_reply,put_reply;
  //本地
  rtm_slave_mpipack par;
  get_reply=0;
  athread_get(PE_MODE,p,&par,sizeof(rtm_slave_mpipack),&get_reply,0,0,0);
  while(get_reply!=1);

  //获取当前从核号，行号，列号
  volatile unsigned int myid=athread_get_id(-1);
  volatile unsigned int rowid,colid;
  GET_ROW(rowid);
  GET_COL(colid);

  int SubNx=par.SubNx;
  int SubNy=par.SubNy;
  int SubNz=par.SubNz;
  int DivNx=par.DivNx;
  int DivNy=par.DivNy;
  int DivNz=par.DivNz;

  //LDM数据存储
  float data[xx][yy][zz];

  //CG x-y loop
  int GridLoopX=(par.endX-par.stX+xx*8-1)/(8*xx);
  int GridLoopY=(par.endY-par.stY+yy*8-1)/(8*yy);
  //depth z loop
  int LoopZ=(par.endZ-par.stZ+zz-1)/(zz);

  int ix,iy,iz;
  int tx,ty,tz;
  int XX,YY,ZZ,l;
  int gx,gy,gz;
  int x,y,z;

  //从核- X-Y方向 循环反转
  int LX,LY,LZ=0;
  for(ix=0;ix<GridLoopX;ix++){
	gx=ix*8*xx+colid*xx;
	for(iy=0;iy<GridLoopY;iy++){
	  gy=iy*8*yy+rowid*yy;
	  if(gx<(par.endX-par.stX)&&gy<(par.endY-par.stY)){
		//重新确定X-Y计算范围-针对最边缘的CPE.
		((par.endX-par.stX)-gx)>xx?(XX=xx):(XX=((par.endX-par.stX)-gx));
		((par.endY-par.stY)-gy)>yy?(YY=yy):(YY=((par.endY-par.stY)-gy));

		//CPE block循环
		for(iz=0;iz<LoopZ;iz++){
		  //重新确定Z的计算范围
		  (par.endZ-par.stZ)-(iz*zz)>zz?(ZZ=zz):(ZZ=(par.endZ-par.stZ)-(iz*zz));
		  gz=iz*zz;

		  /**1**/
		  for(l=0;l<3;l++){
			/* 1. Load  In data */
			get_reply=0;
			for(tx=0;tx<XX;tx++){
			  for(ty=0;ty<YY;ty++){
				x=par.stX+gx+tx;
				y=par.stY+gy+ty;
				z=par.stZ+gz;
				athread_get(PE_MODE,par.Pin[l]+n3d_ext((x+5),(y+5),(z+5)),&data[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
			  }
			}
			while(get_reply!=(XX*YY));

			/* 2. write  Out data */
			put_reply=0;
			for(tx=0;tx<XX;tx++){
			  for(ty=0;ty<YY;ty++){
				x=par.stX+gx+tx;
				y=par.stY+gy+ty;
				z=par.stZ+gz;
				athread_put(PE_MODE,&data[tx][ty][0],par.Pout[l]+n3dY((x),(y),(z)),sizeof(float)*(ZZ),&put_reply,0,0);
			  }
			}
			while(put_reply!=(XX*YY));
		  }
		  /**2**/
		  for(l=3;l<6;l++){
			/* 1. Load  In data */
			get_reply=0;
			for(tx=0;tx<XX;tx++){
			  for(ty=0;ty<YY;ty++){
				x=par.stX+gx+tx;
				y=par.stY+gy+ty;
				z=par.stZ+gz;
				athread_get(PE_MODE,par.Pin[l]+n3d_ext((x+5),(SubNy-10+y),(z+5)),&data[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
			  }
			}
			while(get_reply!=(XX*YY));

			/* 2. write  Out data */
			put_reply=0;
			for(tx=0;tx<XX;tx++){
			  for(ty=0;ty<YY;ty++){
				x=par.stX+gx+tx;
				y=par.stY+gy+ty;
				z=par.stZ+gz;
				athread_put(PE_MODE,&data[tx][ty][0],par.Pout[l]+n3dY((x),(y),(z)),sizeof(float)*(ZZ),&put_reply,0,0);
			  }
			}
			while(put_reply!=(XX*YY));
		  }

		}
	  }
	}
  }
}
void SmpipackZ(rtm_slave_mpipack* p){
  int xx= 8;
  int yy= 8;
  int zz= 5;
  //答应字
  volatile unsigned int get_reply,put_reply;
  //本地
  rtm_slave_mpipack par;
  get_reply=0;
  athread_get(PE_MODE,p,&par,sizeof(rtm_slave_mpipack),&get_reply,0,0,0);
  while(get_reply!=1);

  //获取当前从核号，行号，列号
  volatile unsigned int myid=athread_get_id(-1);
  volatile unsigned int rowid,colid;
  GET_ROW(rowid);
  GET_COL(colid);

  int SubNx=par.SubNx;
  int SubNy=par.SubNy;
  int SubNz=par.SubNz;
  int DivNx=par.DivNx;
  int DivNy=par.DivNy;
  int DivNz=par.DivNz;

  //LDM数据存储
  float data[xx][yy][zz];

  //CG x-y loop
  int GridLoopX=(par.endX-par.stX+xx*8-1)/(8*xx);
  int GridLoopY=(par.endY-par.stY+yy*8-1)/(8*yy);
  //depth z loop
  int LoopZ=(par.endZ-par.stZ+zz-1)/(zz);

  int ix,iy,iz;
  int tx,ty,tz;
  int XX,YY,ZZ,l;
  int gx,gy,gz;
  int x,y,z;

  //从核- X-Y方向 循环反转
  int LX,LY,LZ=0;
  for(ix=0;ix<GridLoopX;ix++){
	gx=ix*8*xx+colid*xx;
	for(iy=0;iy<GridLoopY;iy++){
	  gy=iy*8*yy+rowid*yy;
	  if(gx<(par.endX-par.stX)&&gy<(par.endY-par.stY)){
		//重新确定X-Y计算范围-针对最边缘的CPE.
		((par.endX-par.stX)-gx)>xx?(XX=xx):(XX=((par.endX-par.stX)-gx));
		((par.endY-par.stY)-gy)>yy?(YY=yy):(YY=((par.endY-par.stY)-gy));

		//CPE block循环
		for(iz=0;iz<LoopZ;iz++){
		  //重新确定Z的计算范围
		  (par.endZ-par.stZ)-(iz*zz)>zz?(ZZ=zz):(ZZ=(par.endZ-par.stZ)-(iz*zz));
		  gz=iz*zz;

		  /**1**/
		  for(l=0;l<3;l++){
			/* 1. Load  In data */
			get_reply=0;
			for(tx=0;tx<XX;tx++){
			  for(ty=0;ty<YY;ty++){
				x=par.stX+gx+tx;
				y=par.stY+gy+ty;
				z=par.stZ+gz;
				athread_get(PE_MODE,par.Pin[l]+n3d_ext((x+5),(y+5),(z+5)),&data[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
			  }
			}
			while(get_reply!=(XX*YY));

			/* 2. write  Out data */
			put_reply=0;
			for(tx=0;tx<XX;tx++){
			  for(ty=0;ty<YY;ty++){
				x=par.stX+gx+tx;
				y=par.stY+gy+ty;
				z=par.stZ+gz;
				athread_put(PE_MODE,&data[tx][ty][0],par.Pout[l]+n3dZ((x),(y),(z)),sizeof(float)*(ZZ),&put_reply,0,0);
			  }
			}
			while(put_reply!=(XX*YY));
		  }
		  /**2**/
		  for(l=3;l<6;l++){
			/* 1. Load  In data */
			get_reply=0;
			for(tx=0;tx<XX;tx++){
			  for(ty=0;ty<YY;ty++){
				x=par.stX+gx+tx;
				y=par.stY+gy+ty;
				z=par.stZ+gz;
				athread_get(PE_MODE,par.Pin[l]+n3d_ext((x+5),(y+5),(SubNz-10+z)),&data[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
			  }
			}
			while(get_reply!=(XX*YY));

			/* 2. write  Out data */
			put_reply=0;
			for(tx=0;tx<XX;tx++){
			  for(ty=0;ty<YY;ty++){
				x=par.stX+gx+tx;
				y=par.stY+gy+ty;
				z=par.stZ+gz;
				athread_put(PE_MODE,&data[tx][ty][0],par.Pout[l]+n3dZ((x),(y),(z)),sizeof(float)*(ZZ),&put_reply,0,0);
			  }
			}
			while(put_reply!=(XX*YY));
		  }

		}
	  }
	}
  }
}

void SmpiunpackX(rtm_slave_mpipack* p){
  int xx= L1;
  int yy= L2;
  int zz= L3;
  //答应字
  volatile unsigned int get_reply,put_reply;
  //本地
  rtm_slave_mpipack par;
  get_reply=0;
  athread_get(PE_MODE,p,&par,sizeof(rtm_slave_mpipack),&get_reply,0,0,0);
  while(get_reply!=1);

  //获取当前从核号，行号，列号
  volatile unsigned int myid=athread_get_id(-1);
  volatile unsigned int rowid,colid;
  GET_ROW(rowid);
  GET_COL(colid);

  int SubNx=par.SubNx;
  int SubNy=par.SubNy;
  int SubNz=par.SubNz;
  int DivNx=par.DivNx;
  int DivNy=par.DivNy;
  int DivNz=par.DivNz;

  //LDM数据存储
  float data[xx][yy][zz];

  //CG x-y loop
  int GridLoopX=(par.endX-par.stX+xx*8-1)/(8*xx);
  int GridLoopY=(par.endY-par.stY+yy*8-1)/(8*yy);
  //depth z loop
  int LoopZ=(par.endZ-par.stZ+zz-1)/(zz);

  int ix,iy,iz;
  int tx,ty,tz;
  int XX,YY,ZZ,l;
  int gx,gy,gz;
  int x,y,z;

  //从核- X-Y方向 循环反转
  int LX,LY,LZ=0;
  for(ix=0;ix<GridLoopX;ix++){
	gx=ix*8*xx+colid*xx;
	for(iy=0;iy<GridLoopY;iy++){
	  gy=iy*8*yy+rowid*yy;
	  if(gx<(par.endX-par.stX)&&gy<(par.endY-par.stY)){
		//重新确定X-Y计算范围-针对最边缘的CPE.
		((par.endX-par.stX)-gx)>xx?(XX=xx):(XX=((par.endX-par.stX)-gx));
		((par.endY-par.stY)-gy)>yy?(YY=yy):(YY=((par.endY-par.stY)-gy));

		//CPE block循环
		for(iz=0;iz<LoopZ;iz++){
		  //重新确定Z的计算范围
		  (par.endZ-par.stZ)-(iz*zz)>zz?(ZZ=zz):(ZZ=(par.endZ-par.stZ)-(iz*zz));
		  gz=iz*zz;
		  if(par.option==0){
			/**1**/
			for(l=0;l<3;l++){
			  /* 1. Load  In data */
			  get_reply=0;
			  for(tx=0;tx<XX;tx++){
				for(ty=0;ty<YY;ty++){
				  x=par.stX+gx+tx;
				  y=par.stY+gy+ty;
				  z=par.stZ+gz;
				  athread_get(PE_MODE,par.Pin[l]+n3d((x),(y),(z)),&data[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
				}
			  }
			  while(get_reply!=(XX*YY));

			  /* 2. write  Out data */
			  put_reply=0;
			  for(tx=0;tx<XX;tx++){
				for(ty=0;ty<YY;ty++){
				  x=par.stX+gx+tx;
				  y=par.stY+gy+ty;
				  z=par.stZ+gz;
				  athread_put(PE_MODE,&data[tx][ty][0],par.Pout[l]+n3d_ext((SubNx-5+x),(y+5),(z+5)),sizeof(float)*(ZZ),&put_reply,0,0);
				}
			  }
			  while(put_reply!=(XX*YY));
			}
		  }
		  else{
			/**2**/
			for(l=3;l<6;l++){
			  /* 1. Load  In data */
			  get_reply=0;
			  for(tx=0;tx<XX;tx++){
				for(ty=0;ty<YY;ty++){
				  x=par.stX+gx+tx;
				  y=par.stY+gy+ty;
				  z=par.stZ+gz;
				  athread_get(PE_MODE,par.Pin[l]+n3d((x),(y),(z)),&data[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
				}
			  }
			  while(get_reply!=(XX*YY));

			  /* 2. write  Out data */
			  put_reply=0;
			  for(tx=0;tx<XX;tx++){
				for(ty=0;ty<YY;ty++){
				  x=par.stX+gx+tx;
				  y=par.stY+gy+ty;
				  z=par.stZ+gz;
				  athread_put(PE_MODE,&data[tx][ty][0],par.Pout[l]+n3d_ext((x),(y+5),(z+5)),sizeof(float)*(ZZ),&put_reply,0,0);
				}
			  }
			  while(put_reply!=(XX*YY));
			}
		  }
		}
	  }
	}
  }
}
void SmpiunpackY(rtm_slave_mpipack* p){
  int xx= L2;
  int yy= L1;
  int zz= L3;
  //答应字
  volatile unsigned int get_reply,put_reply;
  //本地
  rtm_slave_mpipack par;
  get_reply=0;
  athread_get(PE_MODE,p,&par,sizeof(rtm_slave_mpipack),&get_reply,0,0,0);
  while(get_reply!=1);

  //获取当前从核号，行号，列号
  volatile unsigned int myid=athread_get_id(-1);
  volatile unsigned int rowid,colid;
  GET_ROW(rowid);
  GET_COL(colid);

  int SubNx=par.SubNx;
  int SubNy=par.SubNy;
  int SubNz=par.SubNz;
  int DivNx=par.DivNx;
  int DivNy=par.DivNy;
  int DivNz=par.DivNz;

  //LDM数据存储
  float data[xx][yy][zz];

  //CG x-y loop
  int GridLoopX=(par.endX-par.stX+xx*8-1)/(8*xx);
  int GridLoopY=(par.endY-par.stY+yy*8-1)/(8*yy);
  //depth z loop
  int LoopZ=(par.endZ-par.stZ+zz-1)/(zz);

  int ix,iy,iz;
  int tx,ty,tz;
  int XX,YY,ZZ,l;
  int gx,gy,gz;
  int x,y,z;

  //从核- X-Y方向 循环反转
  int LX,LY,LZ=0;
  for(ix=0;ix<GridLoopX;ix++){
	gx=ix*8*xx+colid*xx;
	for(iy=0;iy<GridLoopY;iy++){
	  gy=iy*8*yy+rowid*yy;
	  if(gx<(par.endX-par.stX)&&gy<(par.endY-par.stY)){
		//重新确定X-Y计算范围-针对最边缘的CPE.
		((par.endX-par.stX)-gx)>xx?(XX=xx):(XX=((par.endX-par.stX)-gx));
		((par.endY-par.stY)-gy)>yy?(YY=yy):(YY=((par.endY-par.stY)-gy));

		//CPE block循环
		for(iz=0;iz<LoopZ;iz++){
		  //重新确定Z的计算范围
		  (par.endZ-par.stZ)-(iz*zz)>zz?(ZZ=zz):(ZZ=(par.endZ-par.stZ)-(iz*zz));
		  gz=iz*zz;
		  if(par.option==0){
			/**1**/
			for(l=0;l<3;l++){
			  /* 1. Load  In data */
			  get_reply=0;
			  for(tx=0;tx<XX;tx++){
				for(ty=0;ty<YY;ty++){
				  x=par.stX+gx+tx;
				  y=par.stY+gy+ty;
				  z=par.stZ+gz;
				  athread_get(PE_MODE,par.Pin[l]+n3dY((x),(y),(z)),&data[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
				}
			  }
			  while(get_reply!=(XX*YY));

			  /* 2. write  Out data */
			  put_reply=0;
			  for(tx=0;tx<XX;tx++){
				for(ty=0;ty<YY;ty++){
				  x=par.stX+gx+tx;
				  y=par.stY+gy+ty;
				  z=par.stZ+gz;
				  athread_put(PE_MODE,&data[tx][ty][0],par.Pout[l]+n3d_ext((x+5),(SubNy-5+y),(z+5)),sizeof(float)*(ZZ),&put_reply,0,0);
				}
			  }
			  while(put_reply!=(XX*YY));
			}
		  }
		  else{
			/**2**/
			for(l=3;l<6;l++){
			  /* 1. Load  In data */
			  get_reply=0;
			  for(tx=0;tx<XX;tx++){
				for(ty=0;ty<YY;ty++){
				  x=par.stX+gx+tx;
				  y=par.stY+gy+ty;
				  z=par.stZ+gz;
				  athread_get(PE_MODE,par.Pin[l]+n3dY((x),(y),(z)),&data[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
				}
			  }
			  while(get_reply!=(XX*YY));

			  /* 2. write  Out data */
			  put_reply=0;
			  for(tx=0;tx<XX;tx++){
				for(ty=0;ty<YY;ty++){
				  x=par.stX+gx+tx;
				  y=par.stY+gy+ty;
				  z=par.stZ+gz;
				  athread_put(PE_MODE,&data[tx][ty][0],par.Pout[l]+n3d_ext((x+5),(y),(z+5)),sizeof(float)*(ZZ),&put_reply,0,0);
				}
			  }
			  while(put_reply!=(XX*YY));
			}
		  }
		}
	  }
	}
  }
}
void SmpiunpackZ(rtm_slave_mpipack* p){
  int xx= 8;
  int yy= 8;
  int zz= 5;
  //答应字
  volatile unsigned int get_reply,put_reply;
  //本地
  rtm_slave_mpipack par;
  get_reply=0;
  athread_get(PE_MODE,p,&par,sizeof(rtm_slave_mpipack),&get_reply,0,0,0);
  while(get_reply!=1);

  //获取当前从核号，行号，列号
  volatile unsigned int myid=athread_get_id(-1);
  volatile unsigned int rowid,colid;
  GET_ROW(rowid);
  GET_COL(colid);

  int SubNx=par.SubNx;
  int SubNy=par.SubNy;
  int SubNz=par.SubNz;
  int DivNx=par.DivNx;
  int DivNy=par.DivNy;
  int DivNz=par.DivNz;

  //LDM数据存储
  float data[xx][yy][zz];

  //CG x-y loop
  int GridLoopX=(par.endX-par.stX+xx*8-1)/(8*xx);
  int GridLoopY=(par.endY-par.stY+yy*8-1)/(8*yy);
  //depth z loop
  int LoopZ=(par.endZ-par.stZ+zz-1)/(zz);

  int ix,iy,iz;
  int tx,ty,tz;
  int XX,YY,ZZ,l;
  int gx,gy,gz;
  int x,y,z;

  //从核- X-Y方向 循环反转
  int LX,LY,LZ=0;
  for(ix=0;ix<GridLoopX;ix++){
	gx=ix*8*xx+colid*xx;
	for(iy=0;iy<GridLoopY;iy++){
	  gy=iy*8*yy+rowid*yy;
	  if(gx<(par.endX-par.stX)&&gy<(par.endY-par.stY)){
		//重新确定X-Y计算范围-针对最边缘的CPE.
		((par.endX-par.stX)-gx)>xx?(XX=xx):(XX=((par.endX-par.stX)-gx));
		((par.endY-par.stY)-gy)>yy?(YY=yy):(YY=((par.endY-par.stY)-gy));

		//CPE block循环
		for(iz=0;iz<LoopZ;iz++){
		  //重新确定Z的计算范围
		  (par.endZ-par.stZ)-(iz*zz)>zz?(ZZ=zz):(ZZ=(par.endZ-par.stZ)-(iz*zz));
		  gz=iz*zz;
		  if(par.option==0){
			/**1**/
			for(l=0;l<3;l++){
			  /* 1. Load  In data */
			  get_reply=0;
			  for(tx=0;tx<XX;tx++){
				for(ty=0;ty<YY;ty++){
				  x=par.stX+gx+tx;
				  y=par.stY+gy+ty;
				  z=par.stZ+gz;
				  athread_get(PE_MODE,par.Pin[l]+n3dZ((x),(y),(z)),&data[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
				}
			  }
			  while(get_reply!=(XX*YY));

			  /* 2. write  Out data */
			  put_reply=0;
			  for(tx=0;tx<XX;tx++){
				for(ty=0;ty<YY;ty++){
				  x=par.stX+gx+tx;
				  y=par.stY+gy+ty;
				  z=par.stZ+gz;
				  athread_put(PE_MODE,&data[tx][ty][0],par.Pout[l]+n3d_ext((x+5),(y+5),(SubNz-5+z)),sizeof(float)*(ZZ),&put_reply,0,0);
				}
			  }
			  while(put_reply!=(XX*YY));
			}
		  }
		  else{
			/**2**/
			for(l=3;l<6;l++){
			  /* 1. Load  In data */
			  get_reply=0;
			  for(tx=0;tx<XX;tx++){
				for(ty=0;ty<YY;ty++){
				  x=par.stX+gx+tx;
				  y=par.stY+gy+ty;
				  z=par.stZ+gz;
				  athread_get(PE_MODE,par.Pin[l]+n3dZ((x),(y),(z)),&data[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
				}
			  }
			  while(get_reply!=(XX*YY));

			  /* 2. write  Out data */
			  put_reply=0;
			  for(tx=0;tx<XX;tx++){
				for(ty=0;ty<YY;ty++){
				  x=par.stX+gx+tx;
				  y=par.stY+gy+ty;
				  z=par.stZ+gz;
				  athread_put(PE_MODE,&data[tx][ty][0],par.Pout[l]+n3d_ext((x+5),(y+5),(z)),sizeof(float)*(ZZ),&put_reply,0,0);
				}
			  }
			  while(put_reply!=(XX*YY));
			}
		  }
		}
	  }
	}
  }
}
